package controller

import (
	"bluebell/logic"
	"bluebell/models"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
	"time"
)

// CreateCommentHandler 创建评论的处理函数
// @Summary 创建评论的处理函数
// @Description 创建帖子评论
// @Tags 评论相关接口(api分组展示使用的)
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param object body models.Comment true "评论信息"
// @Security ApiKeyAuth
// @Success 200 {object} models.ResponseSuccess "成功响应"
// @Failure 400 {object} models.ResponseError "响应错误"
// @Failure 500 {object} models.ResponseError "服务器错误"
// @Router /comment [post]
func CreateCommentHandler(c *gin.Context) {
	// 使用专门的结构体接收参数
	type createCommentReq struct {
		PostID  string `json:"post_id" binding:"required"`
		Content string `json:"content" binding:"required"`
	}

	var req createCommentReq
	if err := c.ShouldBindJSON(&req); err != nil {
		zap.L().Error("CreateCommentHandler with invalid params", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 验证并转换字符串ID为int64
	postID, err := strconv.ParseInt(req.PostID, 10, 64)
	if err != nil {
		zap.L().Error("Invalid postID format",
			zap.String("post_id", req.PostID), zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 创建评论对象 - 使用转换后的int64值
	comment := &models.Comment{
		PostID:     postID, // 这里是转换后的int64值，不是字符串
		Content:    req.Content,
		CreateTime: time.Now().Unix(),
	}

	// 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, models.CodeNeedLogin)
		return
	}
	comment.UserID = userID

	// 检查敏感词
	if CheckSensitiveWords(comment.Content) {
		ResponseError(c, models.CodeSensitiveExist)
		return
	}

	// 创建评论
	if err := logic.CreateComment(comment); err != nil {
		zap.L().Error("logic.CreateComment(comment) failed", zap.Error(err))
		ResponseError(c, models.CodeServerBusy)
		return
	}

	// 返回响应
	ResponseSuccess(c, nil)
}

// GetCommentListHandler 获取评论列表的处理函数
// @Summary 获取评论列表
// @Description 根据帖子ID获取评论列表
// @Tags 评论相关接口(api分组展示使用的)
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param post_id query int true "帖子ID"
// @Param page query int false "页码"
// @Param size query int false "每页数量"
// @Security ApiKeyAuth
// @Success 200 {object} models.ResponseSuccess "成功响应"
// @Failure 400 {object} models.ResponseError "响应错误"
// @Failure 500 {object} models.ResponseError "服务器错误"
// @Router /comment/list [get]
func GetCommentListHandler(c *gin.Context) {
	// 1. 获取参数
	postIDStr := c.Query("post_id")
	page, size := getPageInfo(c)

	// 参数校验
	postID, err := strconv.ParseInt(postIDStr, 10, 64)
	if err != nil {
		zap.L().Error("GetCommentListHandler with invalid post_id", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 2. 获取评论列表
	comments, err := logic.GetCommentList(postID, page, size)
	if err != nil {
		zap.L().Error("logic.GetCommentList failed", zap.Error(err))
		ResponseError(c, models.CodeServerBusy)
		return
	}

	// 3. 返回响应
	ResponseSuccess(c, comments)
}
